package com.zzl.springboot_mybatis_demo.util;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * 提醒：@Component这个注解是一定要的，不然当Spring容器初始化的时候是不会注入ApplicationContext对象的
 * description: 获取SpringBean的工具类
 * @author 朱正磊
 * @date 2019-10-31 23:06:28
 */
@SuppressWarnings("ALL")
@Component
public class SpringUtil implements ApplicationContextAware {

    /**
     * 定义私有静态属性
     */
    private static ApplicationContext applicationContext;

    /**
     * description: 实现ApplicationContextAware接口，注入ApplicationContext到静态变量中.
     * @author 朱正磊
     * @date 2019-11-01 00:27:00
     * @param applicationContext 上下文内容对象
     * @throws BeansException Bean异常
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if (SpringUtil.applicationContext == null) {
            SpringUtil.applicationContext = applicationContext;
        }
    }

    /**
     * description: 获取applicationContext
     * @author 朱正磊
     * @date 2019-10-31 23:21:20
     * @return
     */
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    /**
     * description: 通过name获取Bean
     * @author 朱正磊
     * @date 2019-10-31 23:21:53
     * @param name bean的name
     * @param <T> 泛型
     * @return 返回指定的bean
     */
    public static <T> T getBean(String name) {
        return (T) getApplicationContext().getBean(name);
    }

    /**
     * description: 通过type获取Bean
     * @author 朱正磊
     * @date 2019-10-31 23:22:08
     * @param type bean类型
     * @param <T> 泛型
     * @return 返回指定的bean
     */
    public static <T> T getBean(Class<T> type) {
        return getApplicationContext().getBean(type);
    }

    /**
     * description: 通过name以及type获取Bean
     * @author 朱正磊
     * @date 2019-10-31 23:22:31
     * @param name bean的name
     * @param type bean类型
     * @param <T> 泛型
     * @return 返回指定的bean
     */
    public static <T> T getBean(String name, Class<T> type) {
        return getApplicationContext().getBean(name, type);
    }

    /**
     * description: 判断是否存在指定name的bean
     * @author 朱正磊
     * @date 2019-10-31 21:24:13
     * @param name bean的name
     * @return 如果存在返回true，否则返回false
     */
    public static Boolean containsBean(String name) {
        return getApplicationContext().containsBean(name);
    }

}
